node学习笔记——mongose使用实践

最近自己在做一个比较简单的购物商场小项目,在实践中体验 nodejs 的魅力所在,训练自己实际项目开发能力,这里简单记录一下在项目接口中使用 mongose 进行增删改查以及怎么进行子文档的多条数据更新等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//加入购物车
router.post("/addCart",function (req,res,next) {
var userId = "100000077";
var productId = req.body.productId;
var User = require('../models/users');
//根据用户id查询用户信息
User.findOne({userId:userId},function (err,userDoc) {
if(err){
res.json({
status: "1",
msg:err.message
});
}else{
if(userDoc){
let goodsItem = '';
userDoc.cartList.forEach(function (item) {
if(item.productId == productId){//如果购物车存在相同商品
goodsItem = item;
item.productNum++; //商品数量+1
}
});
if(goodsItem){
console.log("重新保存商品信息")
userDoc.save(function (err2,doc2) {
if(err2){
res.json({
status: "1",
msg:err2.message
});
}else{
res.json({
status: "0",
msg: "success",
result: 'success'
})
}
});
}else{
//根据产品id查询产品信息
Goods.findOne({"productId":productId},function (err1,doc) {
if(err1){
res.json({
status: "1",
msg:err1.message
});
}else {
if(doc){
doc.productNum = 1;
doc.checked = 1;
userDoc.cartList.push(doc);
userDoc.save(function (err2,doc2) {
if(err2){
res.json({
status: "1",
msg:err2.message
});
}else{
res.json({
status: "0",
msg: "success",
result: 'success'
})
}
});
}
}
});
}
}
}
})
});

这里是通过 push 到子文档数组中进行增加,如果不是子文档,可以考虑用实例创建和 Model 创建,具体参考:初识Mongoose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//购物车删除
router.post("/cartDel", function (req,res,next) {
var userId = req.cookies.userId;
var productId = req.body.productId;
User.update({ //删除子文档产品
userId:userId
},{
$pull:{
'cartList':{
'productId':productId
}
}
}, function (err,doc) {
if(err){
res.json({
status:'1',
msg:err.message,
result:''
});
}else{
res.json({
status:'0',
msg:'',
result:'succsee'
});
}
});
});

这里是用 Model.update(),然后通过 $pull 删除购物车商品列表,当然也可以通过查询出所有购物车商品,然后遍历对比 id 删除,但是这样方便简单许多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//设置默认地址
router.post("/setDefault",function (req,res,next) {
var userId = req.cookies.userId;
var addressId = req.body.addressId;
if(!addressId){
res.json({
status:'1003',
msg:'addressId is null',
result:''
});
}else{
User.findOne({userId:userId},function (err,doc) {
if(err){
res.json({
status:'1',
msg:err.message,
result:''
});
}else{
var addressList = doc.addressList;
addressList.forEach((item) => {
if(item.addressId == addressId){
item.isDefault = true;
}else{
item.isDefault = false;
}
});
doc.save(function (err1,doc1) {
if(err){
res.json({
status:'1',
msg:err1.message,
result:''
});
}else{
res.json({
status:'0',
msg:'',
result:'succsee'
});
}
});
}
});
}
});

通过查询出所有,然后遍历修改,最后 save 保存修改,这样比较麻烦,也可以通过 Model.update 修改数据,例如,更新子文档中多个数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//修改商品数量和是否选中
router.post("/cartEdit",function (req,res,next) {
var userId = req.cookies.userId;
var productId = req.body.productId;
var productNum = req.body.productNum;
var checked = req.body.checked;
//更新子文档中商品数量和是否选中
User.update({"userId":userId,"cartList.productId":productId},{
"cartList.$.productNum":productNum,
"cartList.$.checked":checked,
},function (err,doc) {
if(err){
res.json({
status:'1',
msg:err.message,
result:''
});
}else{
res.json({
status:'0',
msg:'',
result:'succsee'
});
}
});
});

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//查询用户地址接口
router.get("/addressList",function (req,res,next) {
var userId = req.cookies.userId;
User.findOne({userId:userId},function (err,doc) {
if(err){
res.json({
status:'1',
msg:err.message,
result:''
});
}else{
res.json({
status:'0',
msg:'',
result: doc.addressList
});
}
});
});

分页排序查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//获取商品列表
router.get("/list",function (req,res,next) {
let page = parseInt(req.param('page'));
let pageSize = parseInt(req.param('pageSize'));
let priceLevel = req.param('priceLevel');
let skip = (page-1)*pageSize;
let sort = req.param('sort');
let priceGt = '',priceLte = '';
let params = {};
if(priceLevel != 'all'){//价格筛选
switch (priceLevel){
case '0':
priceGt = 0;
priceLte = 100;
break;
case '1':
priceGt = 100;
priceLte = 500;
break;
case '2':
priceGt = 500;
priceLte = 1000;
break;
case '3':
priceGt = 1000;
priceLte = 5000;
break;
}
params = {
salePrice:{
$gt:priceGt,
$lte: priceLte
}
}
}
//分页
let goodModel = Goods.find(params).skip(skip).limit(pageSize);
goodModel.sort({'salePrice':sort});//根据salePrice排序

goodModel.exec(function (err,doc) {
if(err){
res.join({
status: '1',
msg:err.message
});
}else{
res.json({
status: '0',
msg:'',
result:{
count: doc.length,
list: doc
}
})
}
});
});



完~